#!/bin/bash

# =============================================================================
# LimeReader DMG创建脚本（包含自定义背景）
# 版本: 1.0
# 创建日期: 2025-10-13
# =============================================================================

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 配置变量
PROJECT_ROOT=$(pwd)
BUILD_DIR="build"
DEPLOY_DIR="deploy"
DIST_DIR="dist"
APP_NAME="LimeReader.app"
APP_PATH="$BUILD_DIR/bin/$APP_NAME"
VERSION="2.7.2"
BACKGROUND_IMAGE="resources/dmg_background.png"

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_step() {
    echo -e "${PURPLE}[STEP]${NC} $1"
}

# 检查前置条件
check_prerequisites() {
    log_step "检查前置条件..."

    # 检查应用是否已构建
    if [ ! -d "$APP_PATH" ]; then
        log_error "应用未找到：$APP_PATH"
        log_info "请先运行构建脚本：./build_macos_release.sh"
        exit 1
    fi

    # 检查Python环境
    if ! command -v python3 &> /dev/null; then
        log_error "Python3未找到"
        exit 1
    fi

    # 检查hdiutil
    if ! command -v hdiutil &> /dev/null; then
        log_error "hdiutil未找到（macOS DMG工具）"
        exit 1
    fi

    log_success "前置条件检查通过"
}

# 检查背景图片
check_background_image() {
    log_step "检查背景图片..."

    if [ ! -f "$BACKGROUND_IMAGE" ]; then
        log_warning "未找到自定义背景图：$BACKGROUND_IMAGE"
        log_info "将使用默认白色背景"

        # 创建一个简单的白色背景
        create_default_background
    else
        log_success "找到自定义背景图：$BACKGROUND_IMAGE"

        # 显示背景图信息
        if command -v file &> /dev/null; then
            file_info=$(file "$BACKGROUND_IMAGE")
            log_info "背景图信息：$file_info"
        fi

        # 检查图片尺寸（如果有sips工具）
        if command -v sips &> /dev/null; then
            dimensions=$(sips -g pixelWidth -g pixelHeight "$BACKGROUND_IMAGE" 2>/dev/null | grep -E "pixelWidth|pixelHeight" | awk '{print $2}' | tr '\n' 'x' | sed 's/x$//')
            if [ -n "$dimensions" ]; then
                log_info "背景图尺寸：${dimensions} 像素"

                # 检查是否为推荐尺寸
                if [[ "$dimensions" == "640x480" ]] || [[ "$dimensions" == "800x600" ]] || [[ "$dimensions" == "1280x720" ]]; then
                    log_success "背景图尺寸符合推荐规格"
                else
                    log_warning "建议使用 640x480、800x600 或 1280x720 尺寸的背景图"
                fi
            fi
        fi
    fi
}

# 创建默认背景
create_default_background() {
    log_info "创建默认背景图..."

    mkdir -p "$(dirname "$BACKGROUND_IMAGE")"

    # 使用sips创建一个简单的白色背景
    if command -v sips &> /dev/null; then
        # 创建一个1x1的白色图片，然后放大到640x480
        sips --createFromScratch 640 480 --padColor FFFFFF "$BACKGROUND_IMAGE" &>/dev/null || true
    fi

    if [ ! -f "$BACKGROUND_IMAGE" ]; then
        log_info "无法创建默认背景，将使用纯色背景"
    else
        log_success "默认背景图创建成功"
    fi
}

# 准备dist目录
prepare_dist_directory() {
    log_step "准备输出目录..."

    mkdir -p "$DIST_DIR"
    log_success "输出目录准备完成：$DIST_DIR"
}

# 使用Python脚本创建DMG
create_dmg_with_python() {
    log_step "使用Python脚本创建DMG..."

    cd "$DEPLOY_DIR"

    # 执行Python DMG创建脚本
    python3 create_macos_dmg.py \
        --app-path "../$APP_PATH" \
        --version "$VERSION" \
        --output-dir "../$DIST_DIR" \
        --config "release_config.json"

    local exit_code=$?

    cd ..

    if [ $exit_code -eq 0 ]; then
        log_success "DMG创建完成"
    else
        log_error "DMG创建失败"
        exit 1
    fi
}

# 使用macdeployqt创建DMG（备选方案）
create_dmg_with_macdeployqt() {
    log_step "使用macdeployqt创建DMG..."

    local dmg_name="LimeReader_v${VERSION}_macOS.dmg"
    local dmg_path="$DIST_DIR/$dmg_name"

    # 删除已存在的DMG
    rm -f "$dmg_path"

    # 使用macdeployqt创建DMG
    macdeployqt "$APP_PATH" -dmg -fs HFS+ -volname "LimeReader $VERSION"

    # 移动DMG到dist目录
    if [ -f "${APP_PATH%/*}/LimeReader.dmg" ]; then
        mv "${APP_PATH%/*}/LimeReader.dmg" "$dmg_path"
        log_success "DMG创建完成：$dmg_path"
    else
        log_error "macdeployqt DMG创建失败"
        return 1
    fi
}

# 验证DMG
verify_dmg() {
    log_step "验证DMG文件..."

    local dmg_files=($(find "$DIST_DIR" -name "*.dmg" -type f))

    if [ ${#dmg_files[@]} -eq 0 ]; then
        log_error "未找到DMG文件"
        return 1
    fi

    for dmg_file in "${dmg_files[@]}"; do
        log_info "检查DMG：$(basename "$dmg_file")"

        # 检查文件大小
        local size=$(stat -f%z "$dmg_file" 2>/dev/null || stat -c%s "$dmg_file" 2>/dev/null || echo "unknown")
        if [ "$size" != "unknown" ]; then
            local size_mb=$(echo "scale=2; $size / 1024 / 1024" | bc -l 2>/dev/null || echo "$(($size / 1024 / 1024))")
            log_info "文件大小：${size_mb} MB"
        fi

        # 验证DMG完整性
        if hdiutil verify "$dmg_file" &>/dev/null; then
            log_success "DMG文件验证通过：$(basename "$dmg_file")"
        else
            log_warning "DMG文件验证失败：$(basename "$dmg_file")"
        fi

        # 尝试挂载DMG测试
        log_info "测试挂载DMG..."
        local mount_point=$(mktemp -d)
        if hdiutil attach "$dmg_file" -mountpoint "$mount_point" -nobrowse -quiet; then
            log_success "DMG挂载成功"

            # 检查内容
            if [ -d "$mount_point/$APP_NAME" ]; then
                log_success "应用程序在DMG中存在"
            else
                log_warning "应用程序在DMG中不存在"
            fi

            # 卸载DMG
            hdiutil detach "$mount_point" -quiet &>/dev/null || true
            rmdir "$mount_point" &>/dev/null || true
        else
            log_warning "DMG挂载失败"
        fi
    done
}

# 显示结果
show_results() {
    log_step "显示构建结果..."

    echo -e "${CYAN}"
    echo "========================================"
    echo "        DMG 创建完成！ 🎉"
    echo "========================================"
    echo -e "${NC}"

    local dmg_files=($(find "$DIST_DIR" -name "*.dmg" -type f))

    for dmg_file in "${dmg_files[@]}"; do
        echo -e "${GREEN}📦 DMG文件：${NC}$(basename "$dmg_file")"
        echo -e "${GREEN}📍 完整路径：${NC}$dmg_file"

        # 显示文件大小
        local size=$(stat -f%z "$dmg_file" 2>/dev/null || stat -c%s "$dmg_file" 2>/dev/null || echo "0")
        local size_mb=$(echo "scale=2; $size / 1024 / 1024" | bc -l 2>/dev/null || echo "$(($size / 1024 / 1024))")
        echo -e "${GREEN}📊 文件大小：${NC}${size_mb} MB"

        echo -e "${GREEN}🚀 测试命令：${NC}open \"$dmg_file\""
        echo
    done
}

# 主执行流程
main() {
    echo -e "${CYAN}"
    echo "========================================"
    echo "     LimeReader DMG 创建工具"
    echo "     (支持自定义背景图片)"
    echo "========================================"
    echo -e "${NC}"

    local start_time=$(date +%s)

    # 执行构建步骤
    check_prerequisites
    check_background_image
    prepare_dist_directory

    # 尝试使用Python脚本创建DMG，失败则使用macdeployqt
    if create_dmg_with_python; then
        log_success "使用Python脚本创建DMG成功"
    else
        log_warning "Python脚本创建失败，尝试使用macdeployqt"
        if create_dmg_with_macdeployqt; then
            log_success "使用macdeployqt创建DMG成功"
        else
            log_error "所有DMG创建方法都失败了"
            exit 1
        fi
    fi

    verify_dmg
    show_results

    # 计算总时间
    local end_time=$(date +%s)
    local duration=$((end_time - start_time))
    log_success "总耗时：${duration}秒"
}

# 错误处理
handle_error() {
    local exit_code=$?
    log_error "DMG创建失败，错误代码：$exit_code"
    exit $exit_code
}

# 设置错误处理
trap handle_error ERR

# 执行主流程
main "$@"